//============================================================================================
/**
 * @file	scr_coin.c
 * @brief	スクリプトコマンド：コイン関連
 * @author	Tomomichi Ohta. Miyuki Iwasawa
 * @date	06.06.26
 *
 * このソース内の関数は、field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//============================================================================================
#include "common.h"

#include <nitro/code16.h>
#include "system/pm_str.h"
#include "system\msgdata.h"			//MSGMAN_GetString
#include "system/brightness.h"		//ChangeBrightnessRequest
#include "system\wordset.h"			//WordSet_RegistPlayerName
#include "system/bmp_menu.h"
#include "system/bmp_list.h"
#include "system/get_text.h"
#include "system/window.h"
#include "system/fontproc.h"
#include "system/pms_data.h"
#include "system/wipe.h"

#include "system/lib_pack.h"
#include "fieldsys.h"

#include "script.h"
#include "scrcmd_def.h"
#include "field/eventflag.h"
#include "field/evwkdef.h"
#include "sysflag.h"
#include "syswork.h"
#include "ev_win.h"

#include "savedata/coin.h"				//コインを扱う関数用
#include "savedata/pkthln_svdata.h"

#include "scr_coin.h"

//============================================================================================
//
//	コマンド
//
//============================================================================================
//--------------------------------------------------------------------------------------------
/**
 * 特殊ポイントウィンドウ<COIN,BP,TP>表示
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdExPointWinWrite(VM_MACHINE * core)
{
	u8	id = VMGetU8(core);
	u16 x = VMGetWorkValue(core);
	u16 z = VMGetWorkValue(core);

	GF_BGL_BMPWIN** pMsgWinDat = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_COINWINDAT );
	*pMsgWinDat = EvWin_ExPointWinPut( core->fsys, id, x, z );
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 特殊ポイントウィンドウ<COIN,BP,TP>削除
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdExPointWinDel(VM_MACHINE * core)
{
	GF_BGL_BMPWIN** pMsgWinDat = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_COINWINDAT );

	EvWin_ExPointWinDel(* pMsgWinDat );
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 特殊ポイントウィンドウ<COIN,BP,TP>再表示
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdExPointWrite(VM_MACHINE * core)
{
	u8	id = VMGetU8(core);
	GF_BGL_BMPWIN** pMsgWinDat = GetEvScriptWorkMemberAdrs( core->fsys, ID_EVSCR_COINWINDAT );

	EvWin_ExPointWrite( core->fsys, *pMsgWinDat ,id );
	return 0;
}

//--------------------------------------------------------------------------------------------
/**
 * 所持コイン数を取得
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdCheckCoin( VM_MACHINE * core )
{
	u16 * work = VMGetWork(core);
	*work = (u16)COIN_GetValue(SaveData_GetMyCoin(core->fsys->savedata));

	return	0;
}

//--------------------------------------------------------------------------------------------
/**
 * 所持コインを加える
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdAddCoin( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16 value;

	value = VMGetWorkValue(core);
	COIN_Add(SaveData_GetMyCoin(fsys->savedata), value);

	return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * 所持コインを減らす
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdSubCoin( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16 value;

	value = VMGetWorkValue(core);
	COIN_Sub(SaveData_GetMyCoin(fsys->savedata), value);

	return	0;
}

//--------------------------------------------------------------------------------------------
/**
 * 所持コインを減らす(wk専用版）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdSubWkCoin( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16* c_wk = VMGetWork(core);

	COIN_Sub(SaveData_GetMyCoin(fsys->savedata), *c_wk);

	return	0;
}

//--------------------------------------------------------------------------------------------
/**
 * 所持コイン数を取得(持っているかどうかを返す（_COMP_GOLDのCOIN版）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdCompCoin( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16* ret_wk			= VMGetWork( core );
	u32 coin = VMGetU32(core);

	if(COIN_GetValue(SaveData_GetMyCoin(fsys->savedata)) < coin){
		*ret_wk = FALSE;
	}else{
		*ret_wk = TRUE;
	}

	return	0;
}

//--------------------------------------------------------------------------------------------
/**
 * 所持コイン数を取得(持っているかどうかを返すWK専用（_COMP_GOLDのCOIN版）
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdCompWkCoin( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16* ret_wk			= VMGetWork( core );
	u16* c_wk			= VMGetWork(core);

	if(COIN_GetValue(SaveData_GetMyCoin(fsys->savedata)) < *c_wk){
		*ret_wk = FALSE;
	}else{
		*ret_wk = TRUE;
	}

	return	0;
}


//--------------------------------------------------------------------------------------------
/**
 * コインを加えられるかチェック
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdAddCoinChk(VM_MACHINE * core)
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16* ret_wk			= VMGetWork( core );
	u16 value = VMGetWorkValue(core);

	*ret_wk = COIN_AddCheck(SaveData_GetMyCoin(fsys->savedata), value);
	return 0;
};

//--------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------------
/**
 * スロンポイントを加えるWork版　数値制限に注意! 65535までしか扱えない
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdAddWkThlnPoint( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16 value;

	value = VMGetWorkValue(core);
	PkthlnSv_AddThlnPoint ( PkthlnSv_GetSaveData(fsys->savedata),value);

	return 0;
};

//--------------------------------------------------------------------------------------------
/**
 * スロンポイントを減らすWork版　数値制限に注意! 65535までしか扱えない
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdSubWkThlnPoint( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16 value = VMGetWorkValue(core);

	PkthlnSv_SubThlnPoint ( PkthlnSv_GetSaveData(fsys->savedata),value);
	return	0;
}

//--------------------------------------------------------------------------------------------
/**
 * スロンポイントを持っているかどうかを返すWK版 数値制限に注意! 65535までしか扱えない
 *
 * @param	core		仮想マシン制御構造体へのポインタ
 *
 * @return	"0"
 *
 *	@li field_point_winオーバーレイを明示的に読みこまないと使えません！
 */
//--------------------------------------------------------------------------------------------
BOOL EvCmdCompWkThlnPoint( VM_MACHINE * core )
{
	FIELDSYS_WORK* fsys = core->fsys;
	u16* ret_wk			= VMGetWork( core );
	u16 value			= VMGetWorkValue(core);

	if(PkthlnSv_GetThlnPoint( PkthlnSv_GetSaveData(fsys->savedata)) < value){
		*ret_wk = FALSE;
	}else{
		*ret_wk = TRUE;
	}
	return	0;
}